package clases.busquedalocal;

import interfaces.HeuristicaBusquedaLocal;

import clases.CasoDePrueba;
import clases.Helper;
import clases.ResultadoCasoDePruebaArrayBinarios;
import clases.Tupla;

import java.io.IOException;
import java.util.ArrayList;




public class BusquedaLocalUnaVariable implements HeuristicaBusquedaLocal {
	
	static ArrayList<CasoDePrueba> casosDePrueba = new ArrayList<CasoDePrueba>();
	
	public void doit() throws IOException {
		Helper.leerArchivoBusquedaLocal(this, "TP3_BusquedaLocal1Variable.out");
	}
	
	
	public ResultadoCasoDePruebaArrayBinarios dameLaSolucionDelCaso(CasoDePrueba caso,ResultadoCasoDePruebaArrayBinarios constructiva) {
		
		int[][]matrizClausulas = Helper.llenarPositivosYNegativosMatriz(caso.clausulas, caso.clausulas.size(), constructiva.binarioQueHaceMaxLasClausulas.length);
		int[] contadorVariablesEnTrueMax = Helper.contarValoresVerdaderos(matrizClausulas,constructiva.binarioQueHaceMaxLasClausulas,constructiva.binarioQueHaceMaxLasClausulas.length);
		
		
		ResultadoCasoDePruebaArrayBinarios solucionMax = constructiva;
		
		int[] solucionBusquedaLocal = solucionMax.binarioQueHaceMaxLasClausulas.clone();
		
		Tupla solucionesNuevas = new Tupla();
		
		boolean hiceVerdaderasTodasLasClausulas = false;
		
		int i = 0;
		
		boolean resetieContador = false;
		
		while ( (i < solucionBusquedaLocal.length) && !(hiceVerdaderasTodasLasClausulas) ) {
				
			solucionesNuevas = Helper.chequear1Variable(solucionMax,i,caso,contadorVariablesEnTrueMax,matrizClausulas);
			
			if(solucionesNuevas.clausulasSatisfechas > solucionMax.clausulasMax) {
				solucionMax.clausulasMax = solucionesNuevas.clausulasSatisfechas;
				solucionMax.binarioQueHaceMaxLasClausulas = solucionesNuevas.binarion;
				solucionMax.listaClausulasSatisfechas = solucionesNuevas.listaClausulas;
				contadorVariablesEnTrueMax = solucionesNuevas.contadorVariablesEnTrue.clone();
				//Reseteo los contadores, para volver a centrar en la nueva solucion y explorar toda la vecindad
				i = 0;
				resetieContador = true;
				
				if (caso.c == solucionMax.clausulasMax) {
					hiceVerdaderasTodasLasClausulas = true;
				}
			}
			
			if(!resetieContador) {
				i++;
			}
			
			resetieContador = false;
		}
		
		return solucionMax;
	}
}
